#ifndef GLWIDGET_H
#define GLWIDGET_H

#include <QObject>
#include <QOpenGLWidget>
#include <QOpenGLWidget>
#include <QOpenGLFunctions_3_3_Core>
#include <QOpenGLShaderProgram>
#include <QOpenGLTexture>
#include <QMouseEvent>
#include <QVector3D>
#include <QMatrix4x4>


class GLWidget : public QOpenGLWidget, protected QOpenGLFunctions_3_3_Core
{
    Q_OBJECT
public:
    explicit GLWidget(QWidget* parent = nullptr);
    ~GLWidget() override;

protected:
    // 初始化OpenGL
    void initializeGL() override;
    // 绘制场景
    void paintGL() override;
    // 窗口大小变化时调整视口
    void resizeGL(int w, int h) override;

    // 鼠标交互
    void mousePressEvent(QMouseEvent* event) override;
    void mouseMoveEvent(QMouseEvent* event) override;
    void wheelEvent(QWheelEvent* event) override;

private:
    // 生成球体顶点数据（顶点坐标+纹理坐标）
    void generateSphere(float radius, int rings, int sectors);
    // 加载纹理图片
    bool loadTexture(const QString& path);

    QOpenGLShaderProgram* m_program;  // 着色器程序
    QOpenGLTexture* m_texture;        // 纹理对象
    unsigned int m_vao, m_vbo;        // 顶点数组对象、顶点缓冲对象
    QVector<float> m_vertices;        // 顶点数据（x,y,z,u,v）

    // 变换矩阵
    QMatrix4x4 m_projection;  // 投影矩阵
    QMatrix4x4 m_view;        // 视图矩阵
    QMatrix4x4 m_model;       // 模型矩阵

    // 交互参数
    float m_zoom = 3.0f;              // 缩放因子
    float m_rotX = 0.0f, m_rotY = 0.0f; // 旋转角度
    QPoint m_lastMousePos;            // 上次鼠标位置
    void addTriangle(float radius,
        float x1, float y1, float z1, float u1, float v1,
        float x2, float y2, float z2, float u2, float v2,
        float x3, float y3, float z3, float u3, float v3);
};

#endif // GLWIDGET_H
